///*
// * @(#) HttpUtil.java Create on 2013-6-13
// * 
// * Copyright 2013 by pztx.
// */
//
//package com.zhihuiyanche.common.util;
//
//import java.io.FileNotFoundException;
//import java.io.IOException;
//import java.io.InputStream;
//import java.net.InetAddress;
//import java.net.UnknownHostException;
//import java.security.KeyManagementException;
//import java.security.KeyStore;
//import java.security.KeyStoreException;
//import java.security.NoSuchAlgorithmException;
//import java.security.UnrecoverableKeyException;
//import java.security.cert.CertificateException;
//import java.security.cert.X509Certificate;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.Future;
//
//import javax.net.ssl.SSLContext;
//import javax.net.ssl.TrustManager;
//import javax.net.ssl.X509TrustManager;
//import javax.servlet.http.HttpServletRequest;
//
//import org.apache.http.HttpEntity;
//import org.apache.http.HttpHeaders;
//import org.apache.http.HttpResponse;
//import org.apache.http.NameValuePair;
//import org.apache.http.client.HttpClient;
//import org.apache.http.client.entity.UrlEncodedFormEntity;
//import org.apache.http.client.methods.HttpGet;
//import org.apache.http.client.methods.HttpPost;
//import org.apache.http.conn.scheme.Scheme;
//import org.apache.http.conn.ssl.SSLSocketFactory;
//import org.apache.http.entity.StringEntity;
//import org.apache.http.impl.client.DefaultHttpClient;
//import org.apache.http.message.BasicNameValuePair;
//import org.apache.http.params.CoreConnectionPNames;
//import org.apache.http.params.CoreProtocolPNames;
//import org.apache.http.protocol.HTTP;
//import org.apache.http.util.EntityUtils;
//import org.apache.log4j.Logger;
//
//// import org.apache.commons.httpclient.params.HttpMethodParams;
//
//public class HttpUtil
//{
//	Logger	logger	= Logger.getLogger(HttpUtil.class);
//
//	public static String getRequest(String reqURL, String decodeCharset)
//	{
//		return HttpUtil.getRequest(reqURL, decodeCharset, null);
//	}
//
//	/**
//	 * @param reqURL
//	 * @param decodeCharset
//	 * @return
//	 */
//	public static String getRequest(String reqURL, String decodeCharset, Map<String, String> map)
//	{
//		String responseContent = null; // 响应内容
//		HttpClient httpClient = new DefaultHttpClient();
//		httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 3000);
//		httpClient.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, "UTF-8");
//		httpClient.getParams().setParameter(HttpHeaders.CONTENT_TYPE, "text/xml; charset=utf-8");
//		HttpGet httpGet = new HttpGet(reqURL);
//		if (map != null && map.size() > 0)
//		{
//			for (Map.Entry<String, String> entry : map.entrySet())
//			{
//				httpGet.addHeader(entry.getKey(), entry.getValue());
//			}
//		}
//		try
//		{
//			HttpResponse response = httpClient.execute(httpGet);
//			HttpEntity entity = response.getEntity();
//			if (null != entity)
//			{
//				responseContent = EntityUtils.toString(entity, decodeCharset == null ? "UTF-8" : decodeCharset);
//				EntityUtils.consume(entity);
//			}
//		}
//		catch (Exception e)
//		{
//			e.printStackTrace();
//		}
//		finally
//		{
//			httpClient.getConnectionManager().shutdown(); // 关闭连接,释放资源
//		}
//
//		return responseContent;
//	}
//
//	/**
//	 * 
//	 * 发送HTTP_POST请求
//	 * 
//	 * @see 该方法会自动关闭连接,释放资源
//	 * 
//	 * @see 当<code>isEncoder=true</code>时,其会自动对<code>sendData</code>中的[中文][|][
//	 *      ]等特殊字符进行<code>URLEncoder.encode(string,encodeCharset)</code>
//	 * 
//	 * @param reqURL
//	 *            请求地址
//	 * 
//	 * @param sendData
//	 *            请求参数,若有多个参数则应拼接成param11=value11¶m22=value22¶m33=value33的形式后,
//	 *            传入该参数中
//	 * 
//	 * @return 远程主机响应正文
//	 */
//	public static String sendPostRequest(String reqURL, String sendData, int timeout, int connTimeout)
//	{
//		String responseContent = null;
//
//		HttpClient httpClient = new DefaultHttpClient();
//		httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, timeout);
//		httpClient.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, "UTF-8");
//		httpClient.getParams().setParameter(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded");
//		httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, connTimeout);// 数据传输时间
//		HttpPost httpPost = new HttpPost(reqURL);
//		httpPost.setHeader(HTTP.CONTENT_TYPE, "application/json");
//
//		try
//		{
//			httpPost.setEntity(new StringEntity(sendData.toString(), "UTF-8"));// 解决中文乱码问题
//			HttpResponse response = httpClient.execute(httpPost);
//
//			HttpEntity entity = response.getEntity();
//
//			if (null != entity)
//			{
//				responseContent = EntityUtils.toString(entity, "UTF-8");
//				EntityUtils.consume(entity);
//			}
//		}
//		catch (Exception e)
//		{
//			e.printStackTrace();
//			log("与[" + reqURL + "]通信过程中发生异常,堆栈信息如下", e);
//		}
//		finally
//		{
//			httpPost.releaseConnection();
//			httpClient.getConnectionManager().shutdown();
//		}
//		return responseContent;
//	}
//
//	public static String sendPostRequest(String reqURL, String sendData)
//	{
//		return HttpUtil.sendPostRequest(reqURL, sendData, 120 * 1000, 120 * 1000);
//	}
//
//	/**
//	 * 
//	 * 发送HTTP_POST请求
//	 * 
//	 * @see 该方法会自动关闭连接,释放资源
//	 * 
//	 * @see 该方法会自动对<code>params</code>中的[中文][|][ ]等特殊字符进行
//	 *      <code>URLEncoder.encode(string,encodeCharset)</code>
//	 * 
//	 * @param reqURL
//	 *            请求地址
//	 * 
//	 * @param params
//	 *            请求参数
//	 * 
//	 * @return 远程主机响应正文
//	 */
//	public static String sendPostRequest(String reqURL, Map<String, String> params)
//	{
//		String responseContent = null;
//
//		HttpClient httpClient = new DefaultHttpClient();
//		httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 3000);
//		httpClient.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, "UTF-8");
//		httpClient.getParams().setParameter(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded");
//		HttpPost httpPost = new HttpPost(reqURL);
//
//		List<NameValuePair> formParams = new ArrayList<NameValuePair>(); // 创建参数队列
//		for (Map.Entry<String, String> entry : params.entrySet())
//		{
//			formParams.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
//		}
//
//		try
//		{
//			httpPost.setEntity(new UrlEncodedFormEntity(formParams, "UTF-8"));
//			HttpResponse response = httpClient.execute(httpPost);
//
//			HttpEntity entity = response.getEntity();
//
//			if (null != entity)
//			{
//				responseContent = EntityUtils.toString(entity, "UTF-8");
//				EntityUtils.consume(entity);
//			}
//		}
//		catch (Exception e)
//		{
//			log("与[" + reqURL + "]通信过程中发生异常,堆栈信息如下", e);
//		}
//		finally
//		{
//			httpClient.getConnectionManager().shutdown();
//		}
//		return responseContent;
//	}
//
//	/**
//	 * 
//	 * 发送HTTPS_POST请求
//	 * 
//	 * @see 该方法为<code>sendPostSSLRequest(String,Map<String,String>,String,String)</code>
//	 *      方法的简化方法
//	 * 
//	 * @see 该方法在对请求数据的编码和响应数据的解码时,所采用的字符集均为UTF-8
//	 * 
//	 * @see 该方法会自动对<code>params</code>中的[中文][|][ ]等特殊字符进行
//	 *      <code>URLEncoder.encode(string,"UTF-8")</code>
//	 */
//	public String sendPostSSLRequest(String reqURL, Map<String, String> params)
//	{
//		return sendPostSSLRequest(reqURL, params, null, null);
//	}
//
//	/**
//	 * 
//	 * 发送HTTPS_POST请求
//	 * 
//	 * @see 该方法会自动关闭连接,释放资源
//	 * 
//	 * @see 该方法会自动对<code>params</code>中的[中文][|][ ]等特殊字符进行
//	 *      <code>URLEncoder.encode(string,encodeCharset)</code>
//	 * 
//	 * @param reqURL
//	 *            请求地址
//	 * 
//	 * @param params
//	 *            请求参数
//	 * 
//	 * @param encodeCharset
//	 *            编码字符集,编码请求数据时用之,其为null时默认采用UTF-8解码
//	 * 
//	 * @param decodeCharset
//	 *            解码字符集,解析响应数据时用之,其为null时默认采用UTF-8解码
//	 * 
//	 * @return 远程主机响应正文
//	 */
//	public String sendPostSSLRequest(String reqURL, Map<String, String> params, String encodeCharset, String decodeCharset)
//	{
//		String responseContent = "";
//
//		HttpClient httpClient = new DefaultHttpClient();
//		httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 3000);
//		httpClient.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, "UTF-8");
//		httpClient.getParams().setParameter(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded");
//		X509TrustManager xtm = new X509TrustManager()
//		{
//			@Override
//			public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException
//			{
//			}
//
//			@Override
//			public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException
//			{
//			}
//
//			@Override
//			public X509Certificate[] getAcceptedIssuers()
//			{
//				return null;
//			}
//		};
//
//		try
//		{
//			SSLContext ctx = SSLContext.getInstance("TLS");
//			ctx.init(null, new TrustManager[]
//			{ xtm }, null);
//			SSLSocketFactory socketFactory = new SSLSocketFactory(ctx);
//			httpClient.getConnectionManager().getSchemeRegistry().register(new Scheme("https", 443, socketFactory));
//			HttpPost httpPost = new HttpPost(reqURL);
//
//			List<NameValuePair> formParams = new ArrayList<NameValuePair>();
//			for (Map.Entry<String, String> entry : params.entrySet())
//			{
//				formParams.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
//			}
//
//			httpPost.setEntity(new UrlEncodedFormEntity(formParams, encodeCharset == null ? "UTF-8" : encodeCharset));
//			HttpResponse response = httpClient.execute(httpPost);
//			HttpEntity entity = response.getEntity();
//
//			if (null != entity)
//			{
//				responseContent = EntityUtils.toString(entity, decodeCharset == null ? "UTF-8" : decodeCharset);
//				EntityUtils.consume(entity);
//			}
//		}
//		catch (Exception e)
//		{
//			log("与[" + reqURL + "]通信过程中发生异常,堆栈信息为", e);
//		}
//		finally
//		{
//			httpClient.getConnectionManager().shutdown();
//		}
//
//		return responseContent;
//
//	}
//
//	public static void log(String message, Exception e)
//	{
//		Logger.getLogger(HttpUtil.class).info(message, e);
//	}
//
//	/**
//	 * 获取请求IP地址
//	 * 
//	 * @param request
//	 * @return
//	 * @throws UnknownHostException
//	 * @throws Exception
//	 */
//	public static String getIpAddr(HttpServletRequest request) throws UnknownHostException, Exception
//	{
//		String ipAddress = null;
//		// ipAddress = this.getRequest().getRemoteAddr();
//		ipAddress = request.getHeader("x-forwarded-for");
//		if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress))
//		{
//			ipAddress = request.getHeader("Proxy-Client-IP");
//		}
//		if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress))
//		{
//			ipAddress = request.getHeader("WL-Proxy-Client-IP");
//		}
//		if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress))
//		{
//			ipAddress = request.getRemoteAddr();
//			if (ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1"))
//			{
//				// 根据网卡取本机配置的IP
//				InetAddress inet = null;
//				inet = InetAddress.getLocalHost();
//				ipAddress = inet.getHostAddress();
//			}
//		}
//
//		// 对于通过多个代理的情况，第一个IP为客户端真实IP,多个IP按照','分割
//		if (ipAddress != null && ipAddress.length() > 15)
//		{ // "***.***.***.***".length() = 15
//			if (ipAddress.indexOf(",") > 0)
//			{
//				ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
//			}
//		}
//		return ipAddress;
//	}
//
//	/**
//	 * 发送带有证书的https请求
//	 * 
//	 * @param reqURL
//	 * @param sendData
//	 * @param keyStoreFilePath
//	 *            证书路径
//	 * @param keyPassword
//	 *            证书密码
//	 * @return
//	 */
//	public static String sendPostSSLRequest(String reqURL, String sendData, InputStream cert, String keyPassword)
//	{
//		String responseContent = null;
//		DefaultHttpClient httpClient = new DefaultHttpClient();
//		try
//		{
//			KeyStore keyStore = KeyStore.getInstance("PKCS12");
//			keyStore.load(cert, keyPassword.toCharArray());
//			cert.close();
//			SSLSocketFactory socketFactory = new SSLSocketFactory(keyStore, keyPassword);
//			Scheme sch = new Scheme("https", 443, socketFactory);
//			httpClient.getConnectionManager().getSchemeRegistry().register(sch);
//			httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 3000);
//			httpClient.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, "UTF-8");
//			httpClient.getParams().setParameter(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded");
//			HttpPost httpPost = new HttpPost(reqURL);
//			httpPost.setHeader(HTTP.CONTENT_TYPE, "application/json");
//
//			try
//			{
//				httpPost.setEntity(new StringEntity(sendData.toString(), "UTF-8"));// 解决中文乱码问题
//				HttpResponse response = httpClient.execute(httpPost);
//				HttpEntity entity = response.getEntity();
//
//				if (null != entity)
//				{
//					responseContent = EntityUtils.toString(entity, "UTF-8");
//					EntityUtils.consume(entity);
//				}
//			}
//			catch (Exception e)
//			{
//				e.printStackTrace();
//				log("与[" + reqURL + "]通信过程中发生异常,堆栈信息如下", e);
//			}
//			finally
//			{
//				httpClient.getConnectionManager().shutdown();
//			}
//		}
//		catch (KeyStoreException e1)
//		{
//			e1.printStackTrace();
//		}
//		catch (FileNotFoundException e)
//		{
//			e.printStackTrace();
//		}
//		catch (NoSuchAlgorithmException e)
//		{
//			e.printStackTrace();
//		}
//		catch (CertificateException e)
//		{
//			e.printStackTrace();
//		}
//		catch (IOException e)
//		{
//			e.printStackTrace();
//		}
//		catch (KeyManagementException e1)
//		{
//			// TODO Auto-generated catch block
//			e1.printStackTrace();
//		}
//		catch (UnrecoverableKeyException e1)
//		{
//			// TODO Auto-generated catch block
//			e1.printStackTrace();
//		}
//		return responseContent;
//	}
//
//}
